////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                                                                                                                            //
//                                                         WNProject                                                          //
//                                                                                                                            //
//            This file is distributed under the BSD 2-Clause open source license. See License.txt for details.               //
//                                                                                                                            //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include "WNCore/inc/WNAssert.h"
#include "WNMath/inc/WNVector4.h"
#include "WNMath/inc/WNVector3.h"

using namespace WNMath;

WNVector4::WNVector4() :
    x(0.0f),
    y(0.0f),
    z(0.0f),
    w(0.0f) {
}

WNVector4::WNVector4(WN_FLOAT32 _f) :
    x(_f),
    y(_f),
    z(_f),
    w(_f) {
}

WNVector4::WNVector4(const WN_FLOAT32* _f) :
    x(_f[0]),
    y(_f[1]),
    z(_f[2]),
    w(_f[3]) {
}

WNVector4::WNVector4(const WNVector3& _vector, WN_FLOAT32 _f) :
    x(_vector.x),
    y(_vector.y),
    z(_vector.z),
    w(_f) {
}

WNVector4::WNVector4(WN_FLOAT32 _x, WN_FLOAT32 _y, WN_FLOAT32 _z, WN_FLOAT32 _w) :
    x(_x),
    y(_y),
    z(_z),
    w(_w) {
}

// Operators ///////////////////////////////////////////////////////////////////////////////////////

WNVector4::operator WN_FLOAT32* () {
    return(&x);
}

WNVector4::operator const WN_FLOAT32* () const {
    return(&x);
}

WN_FLOAT32& WNVector4::operator () (WN_INT32 _index) {
    WN_DEBUG_ASSERT(_index < 4);

    return(*(&x + _index));
}

WN_FLOAT32 WNVector4::operator () (WN_INT32 _index) const {
    WN_DEBUG_ASSERT(_index < 4);

    return(*(&x + _index));
}